home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / (A)Z / (A)Z8.ADF / YaboingII / ybcalc.c < prev    next >
C/C++ Source or Header  |  1988-01-05  |  3KB  |  132 lines

  1. /* ybcalc.c (c)1988 Ali T. Ozer
  2. ** The "stack calculator" and window stuff for YaBoing II.
  3. ** Freely distributable.
  4. */
  5.  
  6. #include "yb2.h"
  7.  
  8. extern struct RastPort *rp;  /* The rastport of the YaBoing window */
  9.  
  10. #define STACKSIZE 4
  11. unsigned long stack[STACKSIZE];
  12. int sp; /* =0 when empty, =STACKSIZE when full */
  13.  
  14. long stacklocs[STACKSIZE] = {20L,30L,40L,50L};  /* Locations where we write */
  15.  
  16. unsigned long bestsofar = 0;
  17.  
  18. #define STRLEN 13
  19. char str[STRLEN];
  20.  
  21.  
  22. EraseStackLoc (s) int s; {WriteString (s, "             ", STRLEN);}
  23.  
  24.  
  25. DrawStackLoc (s) int s;  {WriteNum (s, stack[s]);}
  26.  
  27.  
  28. WriteNum (s, num)
  29. int s;
  30. unsigned long num;
  31. {
  32.   unsigned long mult = 1000000000;   /* 1 billion */
  33.   int zeros = false, curdigit;
  34.   char *tstr = str;
  35.     
  36.   while (mult) {
  37.     curdigit = (int)((num / mult) % 10);
  38.     if (curdigit || mult == 1) zeros = true;  /* End of leading zeros! */
  39.     if (curdigit || zeros) *tstr++ = curdigit + '0'; else *tstr++ = ' ';
  40.     if (mult == 1000000000 || mult == 1000000 || mult == 1000) {
  41.       if (zeros) *tstr++ = ','; else *tstr++ = ' ';
  42.     };
  43.     mult /= 10;
  44.   } 
  45.   WriteString (s, str);       
  46. }
  47.  
  48.  
  49. InitMessage ()
  50. {                  
  51.   WriteString (0, " Click  here ");
  52.   WriteString (1, "to start (and");
  53.   WriteString (2, "stop) playing");
  54.   WriteString (3, "--Good luck--");
  55. }
  56.  
  57. WriteString (s, tstr)
  58. int s;
  59. char *tstr;
  60. {
  61.   Move (rp, 32L, stacklocs[s]); 
  62.   Text (rp, tstr, (long)STRLEN);
  63. }  
  64.  
  65. ClearStack ()
  66. {
  67.   int cnt;
  68.   sp = 0;
  69.   for (cnt = 0; cnt < STACKSIZE; cnt++) EraseStackLoc (cnt);
  70. }
  71.  
  72. ShowScore ()
  73. {
  74.   unsigned long score = (sp ? stack[sp-1] : 0L);
  75.   WriteString (0, "SCORE:       "); WriteNum (1, score);  
  76.   WriteString (2, "PREV BEST:   "); WriteNum (3, bestsofar);
  77.   if (score > bestsofar) bestsofar = score;
  78. }
  79.  
  80. ProcessHit (spr)
  81. struct sprrec *spr;
  82. {
  83.   int cnt; unsigned long tmp;
  84.  
  85.   if (TYPE == NUMSPRITE || VAL == OPCHK) {
  86.     if (VAL == OPCHK) VAL = 10 + 2 * Rnd(11);
  87.     if (sp == STACKSIZE) {
  88.       for (cnt = 0; cnt < STACKSIZE-1; cnt++) stack[cnt] = stack[cnt+1];
  89.       stack[STACKSIZE-1] = VAL;
  90.       for (cnt = 0; cnt < STACKSIZE; cnt++) DrawStackLoc (cnt);
  91.     } else {
  92.       stack[sp] = (unsigned long)VAL;
  93.       DrawStackLoc (sp++);
  94.     };
  95.     return;
  96.   };
  97.  
  98.   /* Must be an OPSPRITE, an operator */
  99.   
  100.   if (VAL == OPPOP) {if (sp) EraseStackLoc (--sp);
  101.   } else {
  102.     if (sp < 2) return;
  103.     switch (VAL) {
  104.       case OPADD: stack[sp-2] += stack[sp-1]; break;
  105.       case OPMUL: stack[sp-2] *= stack[sp-1]; break;
  106.       case OPSUB: if (stack[sp-1] > stack[sp-2]) stack[sp-2] = 0;
  107.                   else stack[sp-2] -= stack[sp-1]; 
  108.                   break;
  109.       case OPDIV: if (stack[sp-1] == 0) {ClearStack (); return;};
  110.                   stack[sp-2] /= stack[sp-1]; break;
  111.       case OPSWP: tmp = stack[sp-2]; 
  112.                   stack[sp-2] = stack[sp-1];
  113.                   stack[sp-1] = tmp;
  114.           DrawStackLoc (sp-2);
  115.           DrawStackLoc (sp-1);
  116.                   return;
  117.                   break;
  118.       default: return;
  119.     };
  120.     DrawStackLoc (sp-2);
  121.     EraseStackLoc (--sp);
  122.   }
  123. }
  124.  
  125.  
  126.     
  127.    
  128.     
  129.   
  130.     
  131.       
  132.